/*
 * 享元模式看上去有点玄乎，但是其实也没有那么复杂。我们还是用示例说话。
 *
 * 比如说，大家在使用电脑的使用应该少不了使用WORD软件。使用WORD呢， 那就少不了设置模板。
 *
 * 什么模板呢，比如说标题的模板，正文的模板等等。这些模板呢，又包括很多的内容。
 *
 * 哪些方面呢，比如说字体、标号、字距、行距、大小等等。
 */
 

typedef struct font
{
	int type;
	int sequence;
	int gap;
	int linedistance;

	void (*operate)(struct font * pfont);
}font;

/* 
 * 上面的Font表示了各种Font的模板形式。所以，下面的方法就是定制一个FontFactory的结构
 */
typedef struct font_factory
{
	font ** ppfont;
	int number;
	int size;

	font * getfont(struct font_factory * pfont_factory, int type, int sequence, int gap, int linedistance);
}font_factory;

/*
 * 这里的GetFont即使对当前的Font进行判断，如果Font存在，那么返回；否则创建一个新的Font模式
 */
font * getfont(struct font_factory * pfont_factory, int type, int sequence, int gap, int linedistance)
{
	int index;
	font * pfont;
	font * ppfont;

	if (NULL == pfont_factory)
		return NULL;

	for (index = 0; index < pfont_factory->number; index++) {
		if (type != pfont_factory->ppfont[index]->type)
			continue;

		if (sequence != pfont_factory->ppfont[index]->sequence)
			continue;

		if (gap != pfont_factory->ppfont[index]->gap)
			continue;

		return pfont_factory->ppfont[index];
	}

	pfont = (font*)malloc(sizeof(font));
	assert(NULL != pfont);
	pfont->type = type;
	pfont->sequence = sequence;
	pfont->gap = gap;
	pfont->linedistance = linedistance;

	if (pfont_factory->number < pfont_factory->size)
	{
		pfont_factory->ppfont[index] = pfont;
		pfont_factory->number++;
		return pfont;
	}

	ppfont = (font**)malloc(sizeof(font*) * pfont_factory->size * 2);
	assert(NULL != ppfont);
	memmove(ppfont, pfont_factory->ppfont, pfont_factory->size);
	free(pfont_factory->ppfont);
	pfont_factory->size *= 2;
	pfont_factory->number++;
	ppfont_factory->ppfont = ppfont;
	return pfont;
}


